﻿#pragma once
#include <iostream>
#include <array>
using std::string; // 使用 string
//#include <vcruntime.h>
//#include <string>// for string，在 vs 2022 中可以不需要，因为 iostream 已经包含了 string

struct IntArray {
    size_t sz;
    int* arr = nullptr;

    IntArray() {
        sz = 0;
        arr = nullptr;
    }

    IntArray(size_t sz) {
        this->sz = sz;
        arr = new int[sz];
    }

    IntArray init(size_t sz, int val) {
        this->sz = sz;
        arr = new int[sz];
        for (size_t i = 0; i < sz; ++i)
            arr[i] = val;
        return *this;
    }

    void delete_arr()
    {
        if (arr) {
            delete[] arr;
            arr = nullptr;
        }
    }

    void print_arr() {
        for (int i = 0; i < sz; ++i)
            std::cout << arr[i] << "  ";
        std::cout << std::endl;
    }
};

class ConstTest {
private:
    int* in_x, * in_y;
    mutable int val; // 声明为 mutable 使得 const 成员函数可以修改成员变量
    const string c_name = "ConstTest";
public:
    ConstTest()
        : in_x(nullptr), in_y(nullptr), val(0) {
    }//构造函数，成员初始化列表，需按声明顺序初始化

    const string& GetName() const { return c_name; } // 常量成员变量

    //const int* const get_x() const // ok
    int* get_x() const {
        //in_x = new int[10]; // err 不能修改 const 对象
        return in_x;
    }
    int* get_y() const { return in_y; }

    void set_x(int* x) { in_x = x; }

    void set_y(int* y) { in_y = y; }

    void set_val(int v) const { val = v; } // mutable 使得 const 成员函数可以修改成员变量
protected:
    friend void print_ConstTest(ConstTest& const ct);// 友元函数声明，故意将 const 放 & 后面
};

extern void test_overload(); // 引入测试重载
extern void test_key_word(); // 引入测试关键字


// 宏定义
#define print_start(str) std::cout << " ----------------- " << str << " Start ------------------------\n";
#define print_end(str) std::cout << " ----------------- " << str << " End ------------------------\n\n\n";